iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 11
0
Software Development

Dart 語言 - 開啟 Flutter 的鑰匙系列 第 11

Day11:運算子 (下) - Operators

  • 分享至 

  • xImage
  •  

條件表達式 (Conditional expressions)

狀態 ? 表達式1 : 表達式2

⇒ 用一行指令表達 if-else 條件

範例:有一個函數會根據傳進來的布林值,來顯示不同的文字。

var state = true;

//If-else statement
void printState(bool state){
	if(state){
		print('Success');
	}else{
		print('Failure');
	}
}

//Conditional expressions
void printState(bool state){
	state ? print('Success') : print('Failure');
}
  • 可以發現用條件表達式可以將 if-else 語句改成一行顯示。提升閱讀力。

expr1 ?? expr2

⇒ 若 expr1 為 null ,則回傳 expr2;反之,回傳 expr1。

範例:有一函數判斷文字是否為空,若否則回傳該文字,否則回傳預設值。

void user(String user){
	if(user != null){
		print('user is $user');
	}else{
		print('user is root');
	}
}
  • 將上例用條件表達式改寫
void user(String user){
	final result = user ?? 'root';
	print('user is $result');
}

只需要一行,就能夠處理文字為空的情況。

上篇文章的指派運算子中,其中有一個 ??=

⇒ 若運算子左方的值為空 (null),則使用右邊的值

我們可以將上面範例改寫為,

void user(String user){
    user ??= 'root';
    print('user is $user');
}
  • 用 ??= 改寫,我們少了一個臨時變數。

串接符號 (Cascade notation)

..

串接符號可以用來在相同的物件中,連續執行運算。

在 Kotlin 中,跟 apply{ } 具有相同的效果。

例如,有一個 Student 類別,裡面有幾個屬性。

class Student{
	var id;
  var name;
  var classRoomName;
  var teacher;
}

我們將 Student 類實例化,並設定屬性值。

var student = Student();
student.id = 1;
student.name = 'Andy';
student.classRoomName = '1A';
student.teacher = 'Mandy';
  • 用串聯符號改寫。
var student = Student()
    ..name = 'Andy'
    ..classRoomName = '1A'
    ..id = 3
    ..teacher = 'Mandy';

發現什麼?

  1. 用串聯符號改寫可以不需要先將類別實例化,才設定屬性,減少了使用實例後變數。
  2. 每一個串聯符號後方不需符號,直接換行。

也可以不換行,如下

var student = Student()..name = 'Andy'..classRoomName = '1A'..id = 3..teacher = 'Mandy';

串聯符號除了可以使用在屬性,還可以應用在回傳值為 void 的函數上,

假如,類別裡面有回傳值為 void 的函數 (doSomething1, doSomething2)

class Student{
	var id;
  var name;
  var classRoomName;
  var teacher;

	void doSomething1(){
	}

	void doSomething2(){
	}
}
  • 我們也可以直接在串聯符號中直接呼叫。
var student = Student()
    ..name = 'Andy'
    ..classRoomName = '1A'
    ..id = 3
    ..teacher = 'Mandy'
		..doSomething1()
		..doSomething2();

注意:只有回傳值為 void 的函數才能被串聯。

其他運算子

其他運算子

void main(){
	doSomething(); // ()
	var list = [1,2,3];
	assert(list[0] == 1); //[]
	
	var student1 = Student();
	student.name = 'Andy'; // .
	
	var student2 = Student();
	print(student2?.name); // ?.
}

void doSomething(){}

class Student{
	var String name;
}

運算子優先權

Dart 的運算子根據下方的優先權表進行運算,如果同一運算式裡有不同的運算子,那麼將會跟去該優先權處理。

運算子優先權

  • 如上面說明,如果程式包含多個不同優先權的運算子,會根據該運算子的優先權進行運算,所以有時候會造成程式不是由左至右的研讀。
  • 此時,我們可以使用括弧,利用括弧將運算式包起來。如此,括弧內的運算式就會優先處理。

小結

花了兩篇介紹運算子,大部分的運算子都可以在其他語言中看到,比較要注意的是:

  1. ??= ,非空指派運算子
  2. .. : 串聯運算子
  3. 型別測試運算子:as, is, !is

然後,最重要的是,如果有在一個運算式裡面有多個運算子,一定要用括弧包起來,除了可以提昇閱讀力外,還可以避免後面的運算子優先權高過前面的優先權,反而造成了誤動作。


上一篇
Day10:運算子(上) - Operators
下一篇
Day 12:控制流程語句 (Control flow statements)
系列文
Dart 語言 - 開啟 Flutter 的鑰匙30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言